const g = require('gulp');
const $ = require('gulp-load-plugins')();
const _ = require('lodash');

// 压平路径通配符数组
// @param files 多个dir数组
// @param options gulp.src选项
// @remark 因为gulp.src只要一个数组
function src(files, options) {
    return g.src(_.uniq(_.flattenDeep([files])), options);
}

// 生成src要求的文件通配符
// @param dirs 目录名称或列表
// @param ext 后缀（带.，可空）
function dir(dirs, ext) {
    if (!ext) {
        ext = '';
    } else if (ext === '.') {
        ext = '/.*';
    } else {
        ext = '/*' + ext;
    }
    return _.uniq(_.flattenDeep([dirs])).map(dir => `${dir}/**${ext}`);
}

// 排除目录或文件类型
// @param dirs 目录或后缀名称或列表
// @param ext 后缀（带.，可空）
function exclude(dirs, ext) {
    if (ext) {
        return _.flattenDeep([dirs]).map(dir => `!${dir}/**/*${ext}`);
    }
    return _.flattenDeep([dirs]).map(dir => {
        if (dir[0] === '.' && !dir.endsWith('/')) {
            return `!**/*${dir}`;
        }
        return `!**/${dir}`;
    });
}

// 只复制有更新的文件
function copyNew(srcFiles, dstDir, opt) {
    return src(srcFiles, opt)
        .pipe($.newer(dstDir))
        .pipe(g.dest(dstDir));
}

// 去除node gulp <task>作为任务参数
function getArgs() {
    const args = _.clone(process.argv);
    args.splice(0, 3);
    return args;
}

module.exports = {
    src, dir, exclude, copyNew, getArgs
};
